#ifndef __KERN_DRIVER_KBDREG_H__
#define __KERN_DRIVER_KBDREG_H__

// Special keycodes
#define KEY_HOME            0xE0
#define KEY_END             0xE1
#define KEY_UP              0xE2
#define KEY_DN              0xE3
#define KEY_LF              0xE4
#define KEY_RT              0xE5
#define KEY_PGUP            0xE6
#define KEY_PGDN            0xE7
#define KEY_INS             0xE8
#define KEY_DEL             0xE9

/* This is i8042reg.h + kbdreg.h from NetBSD. */

#define KBSTATP             0x64	// kbd controller status port(I)
#define KBS_DIB             0x01	// kbd data in buffer
#define KBS_IBF             0x02	// kbd input buffer low
#define KBS_WARM            0x04	// kbd input buffer low
#define BS_OCMD             0x08	// kbd output buffer has command
#define KBS_NOSEC           0x10	// kbd security lock not engaged
#define KBS_TERR            0x20	// kbd transmission error
#define KBS_RERR            0x40	// kbd receive error
#define KBS_PERR            0x80	// kbd parity error

#define KBCMDP              0x64	// kbd controller port(O)
#define KBC_RAMREAD         0x20	// read from RAM
#define KBC_RAMWRITE        0x60	// write to RAM
#define KBC_AUXDISABLE      0xa7	// disable auxiliary port
#define KBC_AUXENABLE       0xa8	// enable auxiliary port
#define KBC_AUXTEST         0xa9	// test auxiliary port
#define KBC_KBDECHO         0xd2	// echo to keyboard port
#define KBC_AUXECHO         0xd3	// echo to auxiliary port
#define KBC_AUXWRITE        0xd4	// write to auxiliary port
#define KBC_SELFTEST        0xaa	// start self-test
#define KBC_KBDTEST         0xab	// test keyboard port
#define KBC_KBDDISABLE      0xad	// disable keyboard port
#define KBC_KBDENABLE       0xae	// enable keyboard port
#define KBC_PULSE0          0xfe	// pulse output bit 0
#define KBC_PULSE1          0xfd	// pulse output bit 1
#define KBC_PULSE2          0xfb	// pulse output bit 2
#define KBC_PULSE3          0xf7	// pulse output bit 3

#define KBDATAP             0x60	// kbd data port(I)
#define KBOUTP              0x60	// kbd data port(O)

#define K_RDCMDBYTE         0x20
#define K_LDCMDBYTE         0x60

#define KC8_TRANS           0x40	// convert to old scan codes
#define KC8_MDISABLE        0x20	// disable mouse
#define KC8_KDISABLE        0x10	// disable keyboard
#define KC8_IGNSEC          0x08	// ignore security lock
#define KC8_CPU             0x04	// exit from protected mode reset
#define KC8_MENABLE         0x02	// enable mouse interrupt
#define KC8_KENABLE         0x01	// enable keyboard interrupt
#define CMDBYTE             (KC8_TRANS|KC8_CPU|KC8_MENABLE|KC8_KENABLE)

/* keyboard commands */
#define KBC_RESET           0xFF	// reset the keyboard
#define KBC_RESEND          0xFE	// request the keyboard resend the last byte
#define KBC_SETDEFAULT      0xF6	// resets keyboard to its power-on defaults
#define KBC_DISABLE         0xF5	// as per KBC_SETDEFAULT, but also disable key scanning
#define KBC_ENABLE          0xF4	// enable key scanning
#define KBC_TYPEMATIC       0xF3	// set typematic rate and delay
#define KBC_SETTABLE        0xF0	// set scancode translation table
#define KBC_MODEIND         0xED	// set mode indicators(i.e. LEDs)
#define KBC_ECHO            0xEE	// request an echo from the keyboard

/* keyboard responses */
#define KBR_EXTENDED        0xE0	// extended key sequence
#define KBR_RESEND          0xFE	// needs resend of command
#define KBR_ACK             0xFA	// received a valid command
#define KBR_OVERRUN         0x00	// flooded
#define KBR_FAILURE         0xFD	// diagnosic failure
#define KBR_BREAK           0xF0	// break code prefix - sent on key release
#define KBR_RSTDONE         0xAA	// reset complete
#define KBR_ECHO            0xEE	// echo response

#endif /* !__KERN_DRIVER_KBDREG_H__ */
